//我觉得js中用构造函数来模仿c中的结构体，链表用构造器来模仿
function Node(element){
    this.element=element;
    this.next=null;
}

function LList(){
    //每个链表先去创建一个头结点
    this.head=new Node("head");
    this.find=find;
    this.insert=insert;
    this.remove=remove;
    this.display=display;
    this.findPrevious=findPrevious;
}

//插入新节点
//先要找到你要在哪里插入，找到那个插入的点，
//先写一个find函数,先找到头结点，也就说先找到当前节点，
// 然后当当前节点的next不等于null的时候，就一直遍历，找到之后返回

function find(item){
    //这个currNode获取的是这条链表的头结点，所以你获取的是LList中的head的这个node节点
    //这个node节点有两个属性，一个next一个element
    var currNode=this.head;
    while(currNode.element!==item){
        currNode=currNode.next;
    }
    return currNode;
}

//现在开始插入
//原理：先找到这个节点，然后创建一个节点，让新节点的next指向当前节点的next值，让当前节点指向新节点
function insert(newElement,item){
    var newNode=new Node(newElement);
    var currNode=this.find(item);
    newNode.next=currNode.next;
    currNode.next=newNode;
}
//显示链表的值
//先找出头结点，然后判断节点的next是否等于null
function display(){
    var currNode=this.head;
    while(!(currNode.next==null)){
        console.log(currNode.next.element);
        currNode=currNode.next;
    }
}
//删除表中的数据
//原理：你要先找到是要删除数据的前一个节点，你要让前一个节点的next值等于要删除数据的next值，
//所以先写一个找前驱节点的函数
//找前驱和后继是一样的判断，后一个节点是否为null，且当前元素的next的值等于你要找的元素
function findPrevious(item){
    var currNode=this.head;
    while(!(currNode.next===null)&&currNode.next.element!==item){
        currNode=currNode.next;
    }
    return currNode;
}

function remove(item){
    var preNode=this.findPrevious(item);
    if(!(preNode.next===null)){
        preNode.next=preNode.next.next;
    }
}
